import {BaseDataModel} from "./BaseDataModel.js";

/**
 * @description 栈类型数据封装
 * @class {BaseStackModel}
 * @extends {BaseDataModel}
 * @author hhx
 * @date 2024-11-13 15:11
 * @version 0.1.2
 */
export class BaseStackModel extends BaseDataModel {

    /**
     * @description 存放栈元素
     * @private
     * @type {Array} 栈元素
     */
    _stack = null;

    /**
     * @description 栈构造函数
     * @public
     * @constructor
     */
    constructor() {

        super();

        this.stack = [];
    }

    //========================== 内部属性 ==========================

    /**
     * @description 获取 栈元素
     * @property
     * @protected
     * @return {Array} 栈
     */
    get stack() {
        return this._stack;
    }

    /**
     * @description 设置 栈元素
     * @property
     * @protected
     * @param value {*} 设置的栈元素
     */
    set stack(value) {
        this._stack = value;
    }

    //========================== 属性方法 ==========================

    /**
     * @description 获取栈元素
     * @public
     * @return {Array} 栈元素
     */
    getStack() {
        return this.stack
    }

    /**
     * @description 设置栈元素
     * @public
     * @param value {Array} 栈数组
     */
    setStack(value) {
        this.stack = value;
    }

    //========================== 接口 ==========================

    /**
     * @description 入栈
     * @public
     * @param element {*} 入栈值
     */
    push(element) {
        this.stack.push(element);
    }

    /**
     * @description 出栈
     * @public
     */
    pop() {
        this.stack.pop();
    }

    //========================== 重载方法 ==========================

    /**
     * @description 重新挂载
     * @protected
     * @override
     */
    isEmpty() {
        return this.stack.length === 0;
    }

    /**
     * @description 重新挂载
     * @protected
     * @override
     */
    size() {
        return this.stack.length;
    }
}